gui/macOS: Correctly release objects received via FileProviderUtils functions
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Wed, 26 Mar 2025 12:31:00 +0000 (13:31 +0100)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Thu, 27 Mar 2025 14:16:05 +0000 (14:16 +0000)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
src/gui/macOS/fileprovideritemmetadata_mac.mm
src/gui/macOS/fileprovidermaterialiseditemsmodel_mac.mm
src/gui/macOS/fileprovidersettingscontroller_mac.mm
src/gui/macOS/fileproviderutils.h

index ec96674709ea4551eb53d830e368292ede0fbe33..8ff39979f9113eeaf992a7e505d91e28b5346cce 100644 (file)
@@ -147,6 +147,8 @@ QString FileProviderItemMetadata::getUserVisiblePath() const
     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
     dispatch_release(semaphore);
 
+    [manager release];
+
     return returnPath;
 }
 
index b2fe54011e0258751abbbff2cb05234621bf65e0..cfa73a14a498b4a4d3487845f7d01e3f83d8713d 100644 (file)
@@ -59,6 +59,8 @@ void FileProviderMaterialisedItemsModel::evictItem(const QString &identifier, co
     }];
 
     dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC));
+    [manager release];
+
     if (successfullyDeleted == NO) {
         return;
     }
index d1fd68e69cd81cb00d4337f919e52953b5b4c13b..89e1b76e2b5b8ece555993c916a1e2cca3a912e6 100644 (file)
@@ -167,6 +167,7 @@ public:
         qCInfo(lcFileProviderSettingsController) << "Signalling file provider domain" << userIdAtHost;
         NSFileProviderDomain * const domain = FileProviderUtils::domainForIdentifier(userIdAtHost);
         NSFileProviderManager * const manager = [NSFileProviderManager managerForDomain:domain];
+        [domain release];
         [manager signalEnumeratorForContainerItemIdentifier:NSFileProviderRootContainerItemIdentifier
                                           completionHandler:^(NSError *const error) {
             if (error != nil) {
@@ -186,6 +187,7 @@ public:
     }
 
 public slots:
+    // NOTE: This method will release the provided args so make sure to retain them beforehand
     void enumerateMaterialisedFilesForDomainManager(NSFileProviderManager * const managerForDomain,
                                                     NSFileProviderDomain * const domain)
     {
@@ -228,6 +230,9 @@ public slots:
 
             [storageUseObserver release];
             [enumerator release];
+
+            [managerForDomain release];
+            [domain release];
         };
         [enumerator enumerateItemsForObserver:storageUseObserver startingAtPage:NSFileProviderInitialPageSortedByName];
     }
@@ -283,7 +288,8 @@ private:
                                                                 << ", returning early.";
                     return;
                 }
-
+                [managerForDomain retain];
+                [domain retain];
                 enumerateMaterialisedFilesForDomainManager(managerForDomain, domain);
             }
         }];
index 063be6d6d4d727e0f3c6a46a7f345f472007d6e0..8a710fccf960206480b318dcf4e3ef9a381bf587 100644 (file)
@@ -29,6 +29,10 @@ class QString;
  *
  * You should threfore try to avoid using this in C++ code wherever possible
  * and only use this in *_mac.mm implementation files.
+ *
+ * IMPORTANT: All Objective-C objects returned here need to be released!
+ * They have been internally retained due to the async nature of the
+ * FileProvider API.
  */
 
 namespace OCC {